﻿#region Copyright

// // The contents of this file are subject to the Mozilla Public License
// // Version 1.1 (the "License"); you may not use this file except in compliance
// // with the License. You may obtain a copy of the License at
// //   
// // http://www.mozilla.org/MPL/
// //   
// // Software distributed under the License is distributed on an "AS IS"
// // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
// // License for the specific language governing rights and limitations under 
// // the License.
// //   
// // The Initial Developer of the Original Code is Robert Smyth.
// // Portions created by Robert Smyth are Copyright (C) 2008-2013.
// //   
// // All Rights Reserved.

#endregion

using System.Collections.Generic;
using NoeticTools.NWorkflow.Scopes;


namespace NoeticTools.NWorkflow.Tests.Examples
{
    public class WorkflowRulesA : SampleWorkflowRulesBase
    {
        public WorkflowRulesA(IList<string> eventsLog) : base("Sample", eventsLog)
        {
        }

        protected override void BuildWorkflow()
        {
            base.BuildWorkflow();

            OnBegin.EnterStep("Step A");

            using (Progress.Sequence)
            {
                using (var x = AddStep<Result>("Step A"))
                {
                    x.OnEntry
                     .InvokeFunction(StepMethodA_Completed);

                    x.OnResult(Result.Completed)
                     .TransitionTo("Step B");

                    x.OnAnyUnhandledResult
                     .Exit(Result.Failed);

                    x.Duration.IsExpectedToBe(7.0);
                }

                using (Progress.AlternativeFlows)
                {
                    AddStep<Result>("Step B")
                        .OnEntry.Invoke(StepMethodB).OnReturn().Exit(Result.Completed);

                    AddStep<Result>("Step C")
                        .OnEntry.Invoke(StepMethodB).OnReturn().Exit(Result.Completed);
                }

                AddStep<Result>("Finished").Duration.IsExpectedToBe(5.0);
            }
        }
    }
}